#_*_ coding:utf8 _*_
import paramiko         # SSH 操作模块
import time             # 计时


## SSH_LOGIN
## 登录SSH设备成功不关闭会话，返回ssh连接对象和交互子shell对象，后续可以在登录状态继续操作
def SSH_LOGIN(D_LOGIN_INFO):
    SSH_IP = D_LOGIN_INFO['SSH_IP']
    SSH_PORT = D_LOGIN_INFO['SSH_PORT']
    SSH_USER = D_LOGIN_INFO['SSH_USER']
    SSH_PASS = D_LOGIN_INFO['SSH_PASS']
    SSH = paramiko.SSHClient()
    SSH.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        SSH.connect(SSH_IP, SSH_PORT, SSH_USER, SSH_PASS)       # 尝试登录SSH设备
    except Exception as e:                                      # 登录失败
        E = '函数 SSH_LOGIN() 登录SSH设备失败 '+ str(e)
        return(1, E)                                            # 返回错误代码1和失败原因
    else:                                                       # 登录成功
        SHELL = SSH.invoke_shell()                              # 使用伪终端（子shell）（交互操作界面需要用到）
        return(0, SSH, SHELL)                                   # 返回成功代码0，ssh连接对象，交互子shell对象


## 函数 SHELL_CMD() 执行交互命令返回命令回显字符串
def SHELL_CMD(SHELL, CMD, TIME=2, BUFF=10240):                  # 在交互子SHELL里执行操作命令并预设默认参数
    SHELL.sendall(str(CMD) + '\n')                              # 把命令转成字符串，防止类型不同不能相加
    time.sleep(TIME)                                            # 命令执行后等待足够的时间（默认2秒）以接收回显内容
    B_DATA = SHELL.recv(BUFF)                                   # 保存接收到的回显内容（字节码类型）（接收最大值默认为10240字节）
    S_DATA = B_DATA.decode('utf-8')                             # 回显内容转成字符串类型（使用UTF8编码）
    return(S_DATA)


## 函数 SHELL_CTRL() 执行控制命令返回命令回显字符串
def SHELL_CTRL(SHELL, CTRL, TIME=2, BUFF=10240):
    SHELL.sendall(CTRL)
    time.sleep(TIME)
    B_DATA = SHELL.recv(BUFF)
    S_DATA = B_DATA.decode('utf-8')
    return(S_DATA)

